{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Pbp0RsfCE_9Y"
      },
      "source": [
        "对应 `tf.keras` 的01~02章节"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hSv29N7WE_9c",
        "outputId": "0788484e-d9b3-40b9-9f4e-a5f6c2608708"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=10, micro=12, releaselevel='final', serial=0)\n",
            "matplotlib 3.10.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.0\n",
            "torch 2.5.1+cu121\n",
            "cuda:0\n"
          ]
        }
      ],
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qUiciyeWE_9f"
      },
      "source": [
        "## 数据准备"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "id": "Jg37vD7-E_9g"
      },
      "outputs": [],
      "source": [
        "from torchvision import datasets\n",
        "from torchvision.transforms import ToTensor\n",
        "from torchvision import transforms\n",
        "\n",
        "\n",
        "# 定义数据集的变换\n",
        "transform = transforms.Compose([\n",
        "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
        "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
        "])\n",
        "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
        "train_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=True,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "test_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=False,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "# torchvision 数据集里没有提供训练集和验证集的划分\n",
        "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        },
        "id": "JCpDUiMVE_9h",
        "outputId": "04544107-5c5a-4f7f-8306-a1fffaf20b74"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torchvision.datasets.mnist.FashionMNIST"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>torchvision.datasets.mnist.FashionMNIST</b><br/>def __init__(root: Union[str, Path], train: bool=True, transform: Optional[Callable]=None, target_transform: Optional[Callable]=None, download: bool=False) -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.10/dist-packages/torchvision/datasets/mnist.py</a>`Fashion-MNIST &lt;https://github.com/zalandoresearch/fashion-mnist&gt;`_ Dataset.\n",
              "\n",
              "Args:\n",
              "    root (str or ``pathlib.Path``): Root directory of dataset where ``FashionMNIST/raw/train-images-idx3-ubyte``\n",
              "        and  ``FashionMNIST/raw/t10k-images-idx3-ubyte`` exist.\n",
              "    train (bool, optional): If True, creates dataset from ``train-images-idx3-ubyte``,\n",
              "        otherwise from ``t10k-images-idx3-ubyte``.\n",
              "    download (bool, optional): If True, downloads the dataset from the internet and\n",
              "        puts it in root directory. If dataset is already downloaded, it is not\n",
              "        downloaded again.\n",
              "    transform (callable, optional): A function/transform that  takes in a PIL image\n",
              "        and returns a transformed version. E.g, ``transforms.RandomCrop``\n",
              "    target_transform (callable, optional): A function/transform that takes in the\n",
              "        target and transforms it.</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 203);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 21
        }
      ],
      "source": [
        "type(train_ds)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uH86xN9GE_9i",
        "outputId": "6352f3f8-d593-4619-df9f-010d978d23f6"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "60000"
            ]
          },
          "metadata": {},
          "execution_count": 22
        }
      ],
      "source": [
        "len(train_ds)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "zIp3BXbbE_9i",
        "outputId": "61a9c371-b07a-4c65-f640-897d2aa7897b"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tuple"
            ]
          },
          "metadata": {},
          "execution_count": 23
        }
      ],
      "source": [
        "type(train_ds[0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "YGFmKL17E_9j",
        "outputId": "080e3c8a-8436-4cf2-d529-261cdd867707"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Size([1, 28, 28])"
            ]
          },
          "metadata": {},
          "execution_count": 24
        }
      ],
      "source": [
        "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
        "img, label = train_ds[0]\n",
        "img.shape#这里报错是因为image没有shape，把上边那个注释取消掉进行归一化之后就不会报错了\n",
        "# img.shape = (1, 28, 28)，这是因为通道数在最前面"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 186
        },
        "id": "Bi8QYy9iE_9k",
        "outputId": "07cf90f8-4350-4ff4-8e4f-742ffb974afc"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "PIL.Image.Image"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>PIL.Image.Image</b><br/>def __init__() -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.10/dist-packages/PIL/Image.py</a>This class represents an image object.  To create\n",
              ":py:class:`~PIL.Image.Image` objects, use the appropriate factory\n",
              "functions.  There&#x27;s hardly ever any reason to call the Image constructor\n",
              "directly.\n",
              "\n",
              "* :py:func:`~PIL.Image.open`\n",
              "* :py:func:`~PIL.Image.new`\n",
              "* :py:func:`~PIL.Image.frombytes`</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 533);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ],
      "source": [
        "type(img) #tensor中文是 张量,和numpy的ndarray类似"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 45
        },
        "id": "UYx3zFwpE_9l",
        "outputId": "822bfae1-25a2-477c-bf0d-a59c7ed98c23"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<PIL.Image.Image image mode=L size=28x28>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACD0lEQVR4AbWRz2sTQRTH38zszm42k6Q2TU2ixURstRdRasWC9FCsUE9SpIKnKl48+x94UOjNiyf/h4KgKN7TYgNKK+agjZS0wZDYbND90dn54VqxIWfxXebBB97nfecB/P9CAKkFAGT8ViEEh+9fLZZn7gde+E4AwkgAGYBEzl3btZz55y0tgSl/AHKYLhH85uJKdat2ebqyFmuOCun5laFIwcYXjvLRxq1nfRh3er0ESHAI1fvPYqF8oj9WxxO6hcAyWZhQV2fw6OvBbcEh2O/tlxTCjlRjgPtGAqwYcpN7GWUlPbppXepDTeB2AduQHONWpOzsi09GHxocPobUccZPh8RhcvfOy/V4IUQwigMIgFdeQHWb2BFEipzvxU6iBT9QALNPq8F3oYTnSRt8oN4iHOYcLk4UFs+GOEo0TZrlToXNqp7ZmkQw8yg3JIkrHI6C2lI1dawE9dQPP8HSDiJrRSF9IAFAZmT5+oNm+LU+nuVmispT6N6TbcYsMDONZg7nb9rl5NQU5pgCMq8YrUY6bDCa3t9hQShWt0rD3I0kNxWiE8aebiRH3E7bsEw7hTuTXqNrdSIRJfK9C8aH1bvNesioTcmB1P43JY2QcdeNRLkVR7nx8HjblYQaBGnTpCYC1AKq8ptLCMf55x6PZjAxJGrpPfWTgI58/LZW+fMJ8WXO5bond/j20Y3+sfkFaCTYdrBYeB0AAAAASUVORK5CYII=\n",
            "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q==\n"
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "source": [
        "# img[0]#这里注释掉还是主要想看图片，如果开头没有注释掉归一化的代码，那么就执行这句话不会报错，记得把下边的注释掉\n",
        "img"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 25,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "PQovRlNtE_9m",
        "outputId": "76180062-00d4-48bf-c80a-6695c6d91ed5"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
              "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
              "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
              "         0.0118],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
              "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
              "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
              "         0.0588],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
              "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
              "         0.2588],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
              "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
              "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
              "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
              "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
              "         0.2039],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
              "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
              "         0.2196],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
              "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
              "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
              "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
              "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
              "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
              "         0.0000],\n",
              "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
              "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
              "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
              "         0.0000],\n",
              "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
              "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
              "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
              "         0.0000],\n",
              "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
              "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
              "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
              "         0.1137],\n",
              "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
              "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
              "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
              "         0.2627],\n",
              "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
              "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
              "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
              "         0.4510],\n",
              "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
              "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
              "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
              "         0.3608],\n",
              "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
              "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
              "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
              "         0.0000],\n",
              "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
              "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
              "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
              "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000]])"
            ]
          },
          "metadata": {},
          "execution_count": 25
        }
      ],
      "source": [
        "img[0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Dn8LJiseE_9n",
        "outputId": "7060211a-db37-482f-fc52-e3e0a460dbff"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(tensor([0.2860]), tensor([0.3205]))\n"
          ]
        }
      ],
      "source": [
        "#计算均值和方差\n",
        "def cal_mean_std(ds):\n",
        "    mean = 0.\n",
        "    std = 0.\n",
        "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
        "        mean += img.mean(dim=(1, 2))\n",
        "        std += img.std(dim=(1, 2))\n",
        "    mean /= len(ds)\n",
        "    std /= len(ds)\n",
        "    return mean, std\n",
        "\n",
        "\n",
        "print(cal_mean_std(train_ds))\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hUv_xfXoE_9n",
        "outputId": "07138b9e-544f-4cf9-bb05-b1f1dc906727"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Tensor"
            ]
          },
          "metadata": {},
          "execution_count": 27
        }
      ],
      "source": [
        "type(img)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 28,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "sYRg5sf-E_9o",
        "outputId": "26c079cf-c247-4cb0-80aa-348452790b49"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "9"
            ]
          },
          "metadata": {},
          "execution_count": 28
        }
      ],
      "source": [
        "label"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 29,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ERebdsCiE_9p",
        "outputId": "0d17dea0-b59c-4298-aef5-9a5a702b1baa"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Tensor"
            ]
          },
          "metadata": {},
          "execution_count": 29
        }
      ],
      "source": [
        "type(img) #tensor中文是 张量,和numpy的ndarray类似"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "nPA_-h1mE_9p",
        "outputId": "5a6e877d-f117-4201-82ca-54513599aed5"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "9"
            ]
          },
          "metadata": {},
          "execution_count": 30
        }
      ],
      "source": [
        "label"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ub0ih0wIE_9q",
        "outputId": "5a442631-f1e3-449f-8453-f7dd391f9fcd"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "图像大小: (28, 28)\n",
            "图像模式: L\n",
            "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
          ]
        }
      ],
      "source": [
        "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
        "def show_img_content(img):\n",
        "    from PIL import Image\n",
        "\n",
        "    # 打开一个图像文件\n",
        "    # img = Image.open(img)\n",
        "\n",
        "\n",
        "    print(\"图像大小:\", img.size)\n",
        "    print(\"图像模式:\", img.mode)\n",
        "\n",
        "\n",
        "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
        "    if img.mode == 'L':\n",
        "        pixel_values = list(img.getdata())\n",
        "        print(pixel_values)\n",
        "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "id": "CDdPHl7UE_9q",
        "outputId": "3f6b311f-c359-4eea-880c-8c8bb21a30d4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 430
        }
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
        "def show_single_image(img_arr):\n",
        "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片\n",
        "    plt.colorbar() # 显示颜色条\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "show_single_image(img)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "metadata": {
        "id": "_cphX-HPE_9r",
        "outputId": "328cd50f-cfbb-4359-c1b2-2d6dabb839f5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 413
        }
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 700x480 with 15 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfVNJREFUeJztnXd4FlXaxu8IJMHQIQFCCRBAumioCoamkSoggigCooAKKruuLLqrgHVRipVmQcW4FA1SliIIFppSpIggLaCi9BZAiZD5/vDK+Z7zJDO8hLRJ7t91eflM5rwz551zzryHpwY5juOAEEIIIcSHXJXTHSCEEEIIySjcyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S25aiPTv39/FClS5JLtWrVqhVatWmXafVu1aoV69epl2vVI5rBv3z4EBQVh7Nixl2w7atQoBAUFZUOvSKBw/AjJWfLLGrzijczEiRMRFBSEpk2bZkZ/8h0vvPACPv3005zuRoYICgoK6L8vvvgip7tqce7cOYwaNSrX9Su74fjlPd577z1r7EJDQxEZGYm4uDi89tprSEpKyukuEgHXYOZQ8EovEB8fjypVquDbb7/F7t27Ub169czoV77hhRdeQI8ePdC1a9ec7splM336dOv4gw8+wNKlS9P8vXbt2lnel3//+98YMWJEQG3PnTuH0aNHA0Cmavb8Bscv7/LMM8+gatWq+PPPP3Hw4EF88cUXGDZsGMaPH4958+ahQYMGOd1FAq7BzOKKNjKJiYlYvXo1EhISMHjwYMTHx2PkyJGZ1TeSy+nTp491vHbtWixdujTN37ODggULomBB7+mckpKC5OTkbOpR7ofjl3dp3749GjVqZI6feOIJLF++HJ06dUKXLl2wfft2FC5cON3Pnj17FmFhYdnV1XwN12DmcEWmpfj4eJQsWRIdO3ZEjx49EB8fn6aNtNFNnToV0dHRCAkJQePGjbFu3bpL3mPTpk0IDw9Hq1atcObMGdd258+fx8iRI1G9enWEhISgUqVKGD58OM6fPx/w99mwYQNuuOEGFC5cGFWrVsXkyZPTtDl8+DDuu+8+lC1bFqGhobj22mvx/vvvp2l39uxZPPbYY6hUqRJCQkJwzTXXYOzYsZDFxoOCgnD27Fm8//77RoXYv3//gPvrd9avX4+4uDiUKVPGPPMBAwak2/ZScyc9+25QUBCGDh2K+Ph41K1bFyEhIZg8eTLCw8MBAKNHjzbPfdSoUVnyHfMyHD9/0aZNGzz11FPYv38/PvzwQwD/75e4Z88edOjQAUWLFsXdd98N4K8frVdeeQV169ZFaGgoypYti8GDB+PEiRPWdQOZBzNmzEBMTAyKFi2KYsWKoX79+nj11Vez54vnYbgG/+KKNDLx8fHo3r07goOD0bt3b0yaNAnr1q1D48aN07T96KOPkJSUhMGDByMoKAgvvfQSunfvjr1796JQoULpXn/dunWIi4tDo0aNMHfuXNd/QaSkpKBLly5YuXIlBg0ahNq1a2Pr1q2YMGECdu7cGZAPyokTJ9ChQwf07NkTvXv3xqxZs/Dggw8iODjYTIzff/8drVq1wu7duzF06FBUrVoVs2fPRv/+/XHy5Ek8+uijAADHcdClSxesWLEC9913Hxo2bIglS5bg8ccfx4EDBzBhwgQAf6kV77//fjRp0gSDBg0CAERHR1+yr3mBw4cP45ZbbkF4eDhGjBiBEiVKYN++fUhISEjTNiNzJ5Xly5dj1qxZGDp0KMqUKYNrr70WkyZNwoMPPohu3bqhe/fuAEBV+2XC8fMn99xzD5588kl89tlnGDhwIADgwoULiIuLQ4sWLTB27FhcffXVAIDBgwfjvffew7333otHHnkEiYmJeOONN/Ddd99h1apVKFSoUEDzYOnSpejduzfatm2LMWPGAAC2b9+OVatWmXcmuXy4BgVOBlm/fr0DwFm6dKnjOI6TkpLiVKxY0Xn00UetdomJiQ4Ap3Tp0s7x48fN3+fOnesAcObPn2/+1q9fPycsLMxxHMdZuXKlU6xYMadjx47OH3/8YV0zNjbWiY2NNcfTp093rrrqKufrr7+22k2ePNkB4Kxatcrzu8TGxjoAnHHjxpm/nT9/3mnYsKETERHhJCcnO47jOK+88ooDwPnwww9Nu+TkZKd58+ZOkSJFnNOnTzuO4ziffvqpA8B57rnnrPv06NHDCQoKcnbv3m3+FhYW5vTr18+zf35hyJAhTqBTas6cOQ4AZ926da5tLmfujBw5Ms29AThXXXWVs23bNuvvR44ccQA4I0eODKiv+QWOn/+ZNm3aJcelePHiznXXXec4zl/vXADOiBEjrDZff/21A8CJj4+3/r548WLr74HMg0cffdQpVqyYc+HChYx+rXwD12DGyLBpKT4+HmXLlkXr1q0B/KWC6tWrF2bMmIGLFy+mad+rVy+ULFnSHLds2RIAsHfv3jRtV6xYgbi4OLRt2xYJCQkICQnx7Mvs2bNRu3Zt1KpVC0ePHjX/tWnTxlzvUhQsWBCDBw82x8HBwRg8eDAOHz6MDRs2AAAWLlyIcuXKoXfv3qZdoUKF8Mgjj+DMmTP48ssvTbsCBQrgkUcese7x2GOPwXEcLFq06JL9yeuUKFECALBgwQL8+eefnm0vZ+5oYmNjUadOnYx3lKQLx8+/FClSJE300oMPPmgdz549G8WLF8fNN99svVNjYmJQpEgR804NZB6UKFECZ8+exdKlSzP/y+RjuAb/nwxtZC5evIgZM2agdevWSExMxO7du7F79240bdoUhw4dwueff57mM5UrV7aOUx+qtrf+8ccf6NixI6677jrMmjULwcHBl+zPrl27sG3bNoSHh1v/1axZE8BfKrhLERkZmcbBLfXz+/btAwDs378fNWrUwFVX2Y8t1aN8//795v+RkZEoWrSoZ7v8wJkzZ3Dw4EHz35EjRwD8tThuv/12jB49GmXKlMFtt92GadOmpevTFOjcSY+qVatmwrfIv3D88h5nzpyx3k0FCxZExYoVrTa7du3CqVOnEBERkea9eubMGfNODWQePPTQQ6hZsybat2+PihUrYsCAAVi8eHH2fNk8ANfgpcnQRmb58uX47bffMGPGDNSoUcP817NnTwBI1+m3QIEC6V7LEc6vABASEoKOHTvim2++CXiyp6SkoH79+li6dGm6/z300EOX+Q1JZjF27FiUL1/e/JfqPxUUFISPP/4Ya9aswdChQ3HgwAEMGDAAMTExaZy6A5076eHmV0UCg+OXt/jll19w6tQpK01GSEhImn+cpaSkICIiwvWd+swzzwAIbB5ERERg06ZNmDdvnvEdbN++Pfr165d9X9zHcA1emgw5+8bHxyMiIgJvvvlmmnMJCQmYM2cOJk+enKEHEBQUhPj4eNx222244447sGjRokvGqUdHR2Pz5s1o27ZthjMT/vrrr2nCDnfu3AkAqFKlCgAgKioKW7ZsQUpKirXwd+zYYc6n/n/ZsmVISkqy/uWj26V+37xM37590aJFC3Os50SzZs3QrFkzPP/88/joo49w9913Y8aMGbj//vuzrE95/ZlnJhy/vEVqfpK4uDjPdtHR0Vi2bBluvPHGgN7jl5oHwcHB6Ny5Mzp37oyUlBQ89NBDmDJlCp566inmHrsEXIOX5rI1Mr///jsSEhLQqVMn9OjRI81/Q4cORVJSEubNm5fhTgUHByMhIQGNGzdG586d8e2333q279mzJw4cOIC33nor3f6ePXv2kve8cOECpkyZYo6Tk5MxZcoUhIeHIyYmBgDQoUMHHDx4EDNnzrQ+9/rrr6NIkSKIjY017S5evIg33njDuseECRMQFBSE9u3bm7+FhYXh5MmTl+yfX6lWrRratWtn/rvxxhsB/KXS1P8aaNiwIQBcVsh8RkiNysjLzz2z4PjlHZYvX45nn30WVatWNSHWbvTs2RMXL17Es88+m+bchQsXzLMPZB4cO3bMOn/VVVeZCJesnit5Aa7BS3PZGpl58+YhKSkJXbp0Sfd8s2bNEB4ejvj4ePTq1SvDHStcuDAWLFiANm3aoH379vjyyy9d6yHdc889mDVrFh544AGsWLECN954Iy5evIgdO3Zg1qxZWLJkiZUcKj0iIyMxZswY7Nu3DzVr1sTMmTOxadMmTJ061YSnDRo0CFOmTEH//v2xYcMGVKlSBR9//DFWrVqFV155xWhfOnfujNatW+Nf//oX9u3bh2uvvRafffYZ5s6di2HDhlkh1jExMVi2bBnGjx+PyMhIVK1aNV+Ue3j//fcxceJEdOvWDdHR0UhKSsJbb72FYsWKoUOHDll678KFC6NOnTqYOXMmatasiVKlSqFevXqst3UZcPxyN4sWLcKOHTtw4cIFHDp0CMuXL8fSpUsRFRWFefPmITQ01PPzsbGxGDx4MF588UVs2rQJt9xyCwoVKoRdu3Zh9uzZePXVV9GjR4+A5sH999+P48ePo02bNqhYsSL279+P119/HQ0bNsyWjLV5Fa5BweWGOXXu3NkJDQ11zp4969qmf//+TqFChZyjR4+a8K+XX345TTuo8C0Zfp3K0aNHnTp16jjlypVzdu3a5ThO2vBrx/krDHrMmDFO3bp1nZCQEKdkyZJOTEyMM3r0aOfUqVOe3yk2NtapW7eus379eqd58+ZOaGioExUV5bzxxhtp2h46dMi59957nTJlyjjBwcFO/fr1nWnTpqVpl5SU5Pztb39zIiMjnUKFCjk1atRwXn75ZSclJcVqt2PHDuemm25yChcu7ADwdSj25YQObty40endu7dTuXJlJyQkxImIiHA6derkrF+/3rS5nLnjFjo4ZMiQdO+/evVqJyYmxgkODs5VYYQ5CcfP/6SGX6f+Fxwc7JQrV865+eabnVdffdWkiEglvXeuZOrUqU5MTIxTuHBhp2jRok79+vWd4cOHO7/++qvjOIHNg48//ti55ZZbnIiICCc4ONipXLmyM3jwYOe3337LmofgY7gGM0aQ4wTg7UMIIYQQkgu54urXhBBCCCE5BTcyhBBCCPEt3MgQQgghxLdwI0MIIYQQ38KNDCGEEEJ8CzcyhBBCCPEt3MgQQgghxLdkqNYSyZ/IlEMZrbWxfft2Iw8dOtTIqQVHU7nuuuuMLCugFyxoT9lt27YZec6cOUauVq2a1W748OFGLlGixGX2Ov+iK8e/9957Ru7bt6+Ry5Urd8X32rRpk5FT65Klcvvttxs5NdM2cScxMdHIX375pXVu7ty5Ri5VqpSR77nnHqvd9ddfb2Q5Hp988onVbtmyZUaWter69OljtRs0aFBAfSc5x6+//mrkyMjIHOzJ5UGNDCGEEEJ8CzP7EouMaF2+++4761gW1dT/epPl5GWp+d9//91qd/z48YDuLalZs6aRZXVywP4XpdQe6CrAjz32mJHr169/2X3IC8hxmTFjhnXulVdeMbLUlIWHh1vt5DmpQZHXBuzidj///LORu3btarVr3ry5ke+44w6v7ucbFi1aZOQJEyZY52SF5OTkZOucrLN0+vRpI0vtJgAcOnTIyFWqVDGy1oqWL1/eyMWLFzeyLlz4yy+/GLldu3ZGfu2110Bs2rRpY+QTJ05Y58qUKWNkWShZjpEXUusCAK1btzayfA9XrlzZardkyRIjS81bboAaGUIIIYT4Fm5kCCGEEOJbuJEhhBBCiG+hjwwJGGlPlxErmzdvttrJKVWkSBHrnLTdS1u79J0BgAsXLhj51KlTRr766qutdvJzgfr0/PHHH0bWvjnSn6BFixbWuQ8//DCg6+clZs+ebR3L8Xv++eeNrO3u0r9C+kroiLGiRYsaWfpN3HXXXVY76Vuj/WfyE3v27DHyqFGjjBwREWG1k/M6JSXFOif9x+QalD5KGrm29FotVqyYkaU/lPalKV26tJGlv4yeE+PGjXPtR36hVatWRpZjDtjrSY6zftf26NHDyPLddfHiRaud9JmSYyHXOpD2PZ+boEaGEEIIIb6FGxlCCCGE+JY8kxBPW8jczAxJSUnW8cqVK43cvn37gK4vVXNafRooXha9jCaby2q6detm5J9++snIZcuWtdrJ/ms1plZLu7WTz0eqpHU7t894IVWmUq0K2H3/+uuvrXMymV/t2rUDupff0SG0UvU8ZMgQI7/++utWu5CQkHSvoc0IMTExRr733nuNvG/fPqudDu/Or0izi9czkeYkaUoF7DUo319Vq1a12slQankN/X7ScyS9awPAn3/+aWQZKvz9999b7RYsWGDkTp06pXvtvI5MVCiTGwL2+1CmqTh48KDVTq5JaRbasmWL1a5kyZJGlmMk75PboUaGEEIIIb6FGxlCCCGE+JY8Y1rSnvlSfbp7924jv/3221Y7aWaQ2Qq1yaFJkyZG9jInSfOG7pM853UNaT5xM8VkBxs2bLCOpTlJZpeUEUYaHRV04MCBdM/pZyWfj3weOmOvREYc6Xo8MjqmYsWK6d5Ho+8l505+iayQzw0Ajh49auSoqCgj6+chx/nIkSNG1tlH5TyS19ZzisGVf9G/f38jy2y+2swkzb3anO5Wq0pmYwbscZPIKCUgbSShG/L6J0+eNLJcj0D+NSdJoqOjjbx27VrrnPxNkCZcL+S60yZzWVNJvpPPnTsX0LVzA9TIEEIIIcS3cCNDCCGEEN/CjQwhhBBCfEue8ZHxCvNdvny5kZcuXWq1q1SpkpFlGKG2D3722WdGHjhwoJG9Qo+9/FtkplLtixGozTmrWbFihXUsn48Mx9T9l/4u2ob70ksvGVlWzZXjANiZYmU77Usj7f3SR0ZXWd64caORZbVd7Vsgww/195KVvPOLj4zXHD527JjrOen7IquN63UlfWm8sjTn1pQE2Y301ZMVwefOnWu1a9q0qZG1v5EcAxnmq31k5NqQPoN6DOWakSHbhw8fdvkWti/Gf/7zH9d2+RWZ3kG/8+RakH6devx0mHUq2v9T+p/JsdS+ULkZamQIIYQQ4lu4kSGEEEKIb8kzpiWtVpOsW7fOyDpjqFTbSfmWW26x2n333XdGHj58uJEbNWpktatfv76RdfbXb7/9Nt0+3XDDDVY7qTKWqtrs5uOPP7aOpepfPisdwixVz7r/0iwnzXU61HvAgAFGnjJlipHr1q1rtZMmLmle1EX0/va3vxl54sSJRpaqVH09qbYFgB07dhh5586dRq5ZsybyKl4Zs+V80KZdGV6bkXtpU5JXiH9+5ZFHHjHyK6+8Yp2TofHafCrntTRje5kS5PPX15PnvEwTsvirzKLuJxNGduGVIkKuNWlOlyZ4ALjuuuuMLJ+xDnfXpqtUcvK353KhRoYQQgghvoUbGUIIIYT4Fl+blrxU0TI6af369UbWasyzZ88aWZoLpAwAjRs3NnL16tWNrKNjVq9ebeSEhATrnFQRyuiDt956y2onzWRt2rRBTiELjQF2ZJFUb7oVjQNsdbImLi7OyEWKFLHOyQKNY8eONbIsXAkA8+fPN7JUcUu1KmBHLclx0BEYMlJJRy3J779mzRoj52XTkp7fcqxl9IM2LclnJ895Zeh1M/MCaQsf5lfkHJfzeNWqVVa7f/3rX67XkOYkGfWns3DLrOdyDHU7GZnoZqbQ5zp37uzajthmIp2JWa4had7V7aQZXpr89BhJE5Jc315jmdugRoYQQgghvoUbGUIIIYT4Fm5kCCGEEOJbcr2PTEar3j711FNG/u2331zbSR8Jr6qiK1euNLL0udG+Oddff72Ra9SoYZ2T13/jjTeMvHfvXqudzCCb3WzdutXIOszSLdxW+0dIG7rMHKrZtm2bkfXzlmMm7f16Pki7sDwnfVg00v4sMwgD3tllpc/AV199ZeR+/fq53svveFWhDrTSe0Yqwut2eo7lV9yqtevQ22rVqhk5MTHROid9m2R1c+0TJtvJ8dD+bLJKttcYVq5cOd2+k7TId69OGVKrVi0jyzHS70adWiIVL58bOQe8UprkNqiRIYQQQohv4UaGEEIIIb4l15uWMlosrmTJkkaWZgppHgDscDOpitNhp1KFJ00nun/SBCVDsQFbhXfo0CEj33rrrS7fIvsZM2aMkXWYpcwI6hXCLJ+VVmNKs5wsOnj8+HGrnRwL+az09eS9ZJZLnVl25syZRj5x4oSR9XyQn9PnZJ90JuK8ijYPyNBdae7xMhl5FZ50W9/a1EguD/n89btMmg/k+0+amQB7Pcl15mVy8BprnW2buCMLrWrcijx6hUvLdabNxfJYrmn5G5rboUaGEEIIIb6FGxlCCCGE+BZuZAghhBDiW3K9j0xGkX4bXrZ86Qch7ZKlS5e22skQOGlj1iFvXqm85eekLfmXX35J/0vkALISt/RNAYDdu3cbWZYe0D4yMuxch3Q2bdrUyPIZ6HbyWI6ZDil0C9/V4bqyNIUsKSBLVOh76bGNjIw0cteuXZEf8LK7y2esx89rzbkhbfXaR0bPRWI/V/38K1SoYOQtW7a4fk4+Z30NWRZCntPlIuQ7VPrSHD161Gqnqy6non023ELM8yvymV4O0i/GrWo9YD9v+c7zU1VyamQIIYQQ4lu4kSGEEEKIb8n1Ojyt3pdqUaki0yGGMmOrVJ/q0EEZYijbyVBjwDalSLOTNqvI6+kMmKdPnzZy/fr1jazNGzJEuVGjRshOHnrooXRlwA5b3rVrl5EnTZpktfviiy+MrDP7yu9dokQJI8vnBmSs8qpXBlmpnpVj2aBBA6vdRx99dNn3zWvIcdYmOreK8xmtlCtNFtLEoNXpcp1J00ZG1e55nSpVqhhZj6Fca3Kso6KirHbS5CBTJeiwXNlOvl/1u5smo4wRaAoS3c5trep2cu3Kc/o3MDdDjQwhhBBCfAs3MoQQQgjxLble16fVYFJNKk1LMnMrYGfzlQW4dCSRvIY08fz0009WO5lRVmbD1OpSGVWj7yW9+IcMGWLkTZs2We20F39uQaqUmzRpYmQdYbJ8+XIj6/GTz04+b/2ddQRFKlpd7VbwTN4HsMdPmiZklBb5CzmeemwzquZOxctULNHmkOLFixuZ5qRLIzMwe2XbdYsOBNyjlrRpSRaN1CZ+iTYfk8AItHCybiffqV4RnXJspXz48OHL6mdOQo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt+R6HxntO+FWebVevXrWsbTtS78VbR+U9mNpE9R2eBlGLPukM81Kvw9tS65UqZKRZZjv448/brVr1qwZcgPa5iq/qxwH7Q8hq+h6PW8vfwu30MGM4uaLIUPANV625MzoU25Ffjf9DLLrvtrHiaTFzY8MsH0ipI8gYK9drwrHcm3Iz2jfv7JlyxpZ+sv4KXw3N5NRHxm3sGovXxrpSyiz2ed2qJEhhBBCiG/hRoYQQgghviVTTEtSVeVVLE62kyqsQFWkXrRv3946lll1ZVEzrxBAqYLVJi0Ziuhm3gLs/noV0pOF3GRoaW5Cm0/kmEmio6OtY1lsLFDTYKBZKQPFK4OzxOvZ6/nrFcaal/AyJ3mF62bmZ7yevVexxPyE13OQWcRl9l7Afh/KjL0a+T6UmZVlZmzAfU3rMdQpLVJhxl9vvExLXkVu3a4RaEoTmpYIIYQQQrIBbmQIIYQQ4lsypNPzikTJbDXhV199ZR1/8sknRl65cqWRZSZLwC7sKCMgtFpN9ldeQ39HeQ1pZtLX8/LUl+YN2S4hIcFq17lzZ9dr5CRuBTulqhqwI8bkswJs85SMgtJqUTcv+0Azw3oVHZTXyC/mosvBa367jYt+jnJcAo188lJ/y2O5jvJzll8vs5o0C9WtW9c6V7lyZSPLdaGf5aFDh4wszUe6uKT8nDRplS9f3mp34MAB1/4Sm507dxpZm8UDLdbq9d50ayd/D2Um+twONTKEEEII8S3cyBBCCCHEt3AjQwghhBDfkiGHlkD9Co4fP24d//rrr0aWNkD5d8D2GZHtANv/QtoHtW+KDCuMjIw0srYDSz8NaRPWVX+lLVlWTE5KSrLaff3110bWNmwZ6it9RdauXQs/4BYGrb+nVwZcrwyTbu0yww4s+yR9Nrz8DPJy9l4vvJ5poGHxgWYjzcjnAw3hzs/I95BOjyB9XOT7UGbkBux328mTJ42s/RGl/4x+l0vk+1VmUY+IiLDaMbwe2L59u5ErVqxonZPPW/4uaeR7zms9yXbyd+/gwYNWu9WrVxtZ/gbmBvLnLCGEEEJInoAbGUIIIYT4lgyZltasWWMdP/3000aWRcOkOhJwz/CpC/dJ05VWd0rVl1SX6RBgqfqaOXOmkRs3bmy1k+GCUs3qldVQZuU9c+aMdU6qAbW5S6oBZXFJP2VQDASpXtZj6xaK62XCyAj689KUJ8/pzMMkcwpFBmpCdDNV6XGRfcrPY+Zmdvn555+tdj/88IORq1WrZp2TmX6lCb569epWO/mO2rt3r5F1oUn5DvVCZluXRXOHDRtmtcuv5iTJ559/bmRtwpVzwMsMF6gZ2K24pJ4PkyZNMjJNS4QQQgghmQQ3MoQQQgjxLQGblqRq99FHH7XOSVOCV9FEt6y3MmsuYJuJtMlIIouX7d+/3zo3YsSIdK8h1WOAnX1SmpbatGljtZOe/7t27TKyLromTRhaBS5VePI5aa/93EqgUTxeUW0yS6WcH16mJS8Vqds5nQ1TmiS9TBgSRi2lHUs3k5FXJJHXc8xIdJpc97JAaX7AzeyyZMkS67hOnTpG1tm15TOT780KFSpY7Xbs2GFkOQ90FI00tZctW9bI+t0oTVIyy698nwJAjRo1kN+Rkaw6W758ZwUajeSFXHdyrujIXRm1lNugRoYQQgghvoUbGUIIIYT4Fm5kCCGEEOJbAvaRef/9942s/VFkeJ8M2dNZb7XNNBXtpyBt4NoeK+24v//+u5GlbRYA+vXrZ+RPP/3UyLqydGJiYrp937Bhg9VuxYoVRnbLhAjY/j7aT0Mi7Z66nQylrFSpkus1citu2ZcB29buFTro5scifZB0OzkuXlXOJTpFALGzXevxc7PJe1Uvzwh6vOT1tM8Hsf1UAKBBgwZG1mMo3zfaP1Hi5j/mtValn6EOCZe+OW5+OgB9ZAA7JYcOdw80rNrrfeiGnCvy9xWwM/3KeaN/A3MCamQIIYQQ4lu4kSGEEEKIbwnYtCRDhLW5R5qQpJqpcuXKru2k+lpnhixVqpSRZYEzfQ2pxtTFIKUJo1u3bkauX7++1U6q8KTpS6vLZIZaad7Q4amyoJc2GbmFG2u1vCyU6UfTUqBFRTOiInUzEelreJk65Php9anbZ/ITXuGdGVFXB4rX2LplZs7PSLO4TCMB2OY3mVEXsMdXrlWvteCVVsPNPKWLS0rThHQRkNng8ysy2zJgPxOdnkM+b7ds+YC9PgNNdSGvfcstt1jtZs2aZWTpepEbsvxSI0MIIYQQ38KNDCGEEEJ8S8CmJWlO0qpFaf6QkT9aZSjNM+Hh4enKgK361GpLeU6qT3XxRqkCL126tJFlMTXAVrtKU5j2FJf3kv3V6nCpAtfnpOpWqlmLFy9utdu0aZOR27ZtC78RaEbJQE0TgZoSvLLEynNSnS4LeZK/8Iq2c1NXe2XlzQh6bsh1Jd8x+RkZFaTfyfI9qcdTvsvkO0qa+zXS9KHfa24FPatWrWq1kxl85WdklCoAHD9+3MjSzSAv891337me8/od8VqDcpzlHPDK1i3X2Y8//mi1k2O2fft2I9O0RAghhBByBXAjQwghhBDfwo0MIYQQQnxLwD4yDRs2NLIMZwaAadOmGTkyMtLIsmI0YIdIS58WbcOVNkBtt5U2WHk9nYVS2v1kGKAOU5Q2Rmk71NeT/j1u4ea6nZQBOzRb2iJlGCWQNktxbiEj4bYZ9Z1w84vx8r/xCr92qzweqD9PfkKuR68MyZkdBi3HSNvx5XrZs2ePka+77rpM7YOfkO8ovc7kO0/7gcl3qnwn6Wcu343ynad9NuQ7UFa1btSokdXuq6++MrJ8D+t3rfTHyS8+MgsWLLCOy5QpY2SdzVyOkxwj7Scq16d8xrqdzLIsx1b6cer7bt26NZ1vkXNQI0MIIYQQ38KNDCGEEEJ8S8CmJcmTTz5pHUuz09ixY42sTSYybFmaXXQGSKkm1eHXbqF+XplcvUIRpRnL63oSeU73XapgZRghYKsBpdpOFngDgD59+rjeOycJNBOvVFd7ZQuV6PBRNzODVqHrz7n1T/ZdXi9QU1V+4tdff3U9J5+/Wyg2EHgGYLfCoXr9SZW3VLvnZ2Qmcv1ek+/a77//3jon16RM/aCvIZ+5lyuANPHL4pUdO3a02sl3vryGzmrrVqwyLyPNpYD9O6JNPG6pRXS7+fPnG7lTp05GLly4sNVOmh51Fmi3dtu2bXNtlxNQI0MIIYQQ38KNDCGEEEJ8CzcyhBBCCPEtAfvIuNmyAaBDhw7pysuXL7faSd8aWXVap6iW9nHtwyBDB71CQWXFUGmj15W7pX1X2gcDDcuV/iCA7TOj/TluvvlmI9euXdvIuSHFc1ahn4H0T5FjptvJY6+55+bLpP0y3MLAGX6dFrkmdPoD+Vzls9PjEKgfkgwtle30OEsfDVlKJD8jS8Do+S19J06ePGmdk89ZpsvQvi+yTEtYWJjrvdzQ/hbyenIeyWsDwG+//Wbka665JqB7+R3pwwIAX3zxhZH12pJrw6vEipu/i1dZHa928r1Qv3591/vmBNTIEEIIIcS3cCNDCCGEEN8SsGnJLczVizZt2ljHa9euTbfdjh07rGOpMtVVqH/55RcjR0VFGVmbeHRWYXLlBBqOLNXVsuItYKsr5ZzS80uqueU53Qd5HGglXwnDr9PSpEkTI+/cudM6J80UUtWskepwOS6BPlNpXgDsOZBfzA2XQlYB12kgdEizRFZFlu9NHfYs38MynFtXH5ftpKxDit3C6/WckKHH+YWBAwdax4MGDTKyNi1Js6HOxixx+83W6Qvkmpbz4fTp01Y7efzoo4+63jcnoEaGEEIIIb6FGxlCCCGE+JYMZfbNbGrVquV5LKlXr15Wd4dcIVJVqQuUSZOPzEyqTTwyMiJQM5FXMUgZrSYzm2r1t1sfgIyZV/2INFP07dvXOrdixQojHz161Mja3CDNFG5REYA9TnL8qlSpYrWTZmptRsmvSLNt1apVrXPSfKSR81pGvWhToYym/Oijj4ysTVBt27ZN99p6/cj3ghzDatWqWe1at27t2vf8gsyQrDO/S3TRYsnhw4fT/bvOACznilyP2sS3ZMkSI0u3jtxA/ngzE0IIISRPwo0MIYQQQnwLNzKEEEII8S1BjleZZ0IEgVa/fvzxx42sq5fLCrhevi/Svi4zVHpVtXYL7QZsPw1pq5ehxkDaDJv5kUDHWaIrvUs7vMzcra9Xrly5dOVAQ7vza4g8YPuq6CysXtmwpV+Y9HX4+eefrXba74bkDr7++msjb9++3cg6k/6ECROMXL58eSPL9zNg+9L06tXLyDJLf26HGhlCCCGE+BZuZAghhBDiW2haIoQQQohvoUaGEEIIIb6FGxlCCCGE+BZuZAghhBDiW7iRIYQQQohv4UaGEEIIIb6FGxlCCCGE+BZuZAghhBDiW7iRIYQQQohv4UaGEEIIIb6FGxlCCCGE+BZuZAghhBDiW7iRIYQQQohv4UaGEEIIIb6FGxlCCCGE+BZfbmSCgoIwatQoc/zee+8hKCgI+/bty7E+kZxh3759CAoKwtixY3O6K/kKrkEiuZLx79+/P6pUqZLpfSKXh5/HMFs2MqkPKPW/0NBQ1KxZE0OHDsWhQ4eyowvkCti6dSt69OiBqKgohIaGokKFCrj55pvx+uuv53TXSIBwDeY9uC79D8cwcyiYnTd75plnULVqVfzxxx9YuXIlJk2ahIULF+L777/H1VdfnZ1dIQGyevVqtG7dGpUrV8bAgQNRrlw5/Pzzz1i7di1effVVPPzwwzndRXIZcA3mDbgu/Q/HMPPI1o1M+/bt0ahRIwDA/fffj9KlS2P8+PGYO3cuevfunZ1dyVbOnj2LsLCwnO5Ghnj++edRvHhxrFu3DiVKlLDOHT58OGc6lc2cO3cuz/zIcw3mDbgu/Q/HMPPIUR+ZNm3aAAASExPRqlUrtGrVKk2bK7G9TZw4EXXr1kVISAgiIyMxZMgQnDx50pwfOnQoihQpgnPnzqX5bO/evVGuXDlcvHjR/G3RokVo2bIlwsLCULRoUXTs2BHbtm1L098iRYpgz5496NChA4oWLYq77747Q/3PDezZswd169ZNs9AAICIiwshBQUEYOnQoPv30U9SrVw8hISGoW7cuFi9enOZzBw4cwIABA1C2bFnT7t1337XaJCcn4+mnn0ZMTAyKFy+OsLAwtGzZEitWrLhknx3HwaBBgxAcHIyEhATz9w8//BAxMTEoXLgwSpUqhTvvvBM///yz9dlWrVqhXr162LBhA2666SZcffXVePLJJy95T7/CNehPAl2X06ZNQ5s2bRAREYGQkBDUqVMHkyZNSvOZKlWqoFOnTli5ciWaNGmC0NBQVKtWDR988EGattu2bUObNm1QuHBhVKxYEc899xxSUlLStJs7dy46duyIyMhIhISEIDo6Gs8++6w1nvkZjmHmkaMbmT179gAASpcunenXHjVqFIYMGYLIyEiMGzcOt99+O6ZMmYJbbrkFf/75JwCgV69eOHv2LP73v/9Znz137hzmz5+PHj16oECBAgCA6dOno2PHjihSpAjGjBmDp556Cj/88ANatGiRxjnqwoULiIuLQ0REBMaOHYvbb789079fdhEVFYUNGzbg+++/v2TblStX4qGHHsKdd96Jl156CX/88Qduv/12HDt2zLQ5dOgQmjVrhmXLlmHo0KF49dVXUb16ddx333145ZVXTLvTp0/j7bffRqtWrTBmzBiMGjUKR44cQVxcHDZt2uTah4sXL6J///744IMPMGfOHHTv3h3AX//66du3L2rUqIHx48dj2LBh+Pzzz3HTTTdZP6wAcOzYMbRv3x4NGzbEK6+8gtatW1/WM/MTXIP+JNB1OWnSJERFReHJJ5/EuHHjUKlSJTz00EN4880307TdvXs3evTogZtvvhnjxo1DyZIl0b9/f2ujePDgQbRu3RqbNm3CiBEjMGzYMHzwwQd49dVX01zvvffeQ5EiRfD3v/8dr776KmJiYvD0009jxIgRV/4A8gAcw0zEyQamTZvmAHCWLVvmHDlyxPn555+dGTNmOKVLl3YKFy7s/PLLL05sbKwTGxub5rP9+vVzoqKirL8BcEaOHJnm+omJiY7jOM7hw4ed4OBg55ZbbnEuXrxo2r3xxhsOAOfdd991HMdxUlJSnAoVKji33367df1Zs2Y5AJyvvvrKcRzHSUpKckqUKOEMHDjQanfw4EGnePHi1t/79evnAHBGjBhxuY8pV/LZZ585BQoUcAoUKOA0b97cGT58uLNkyRInOTnZagfACQ4Odnbv3m3+tnnzZgeA8/rrr5u/3XfffU758uWdo0ePWp+/8847neLFizvnzp1zHMdxLly44Jw/f95qc+LECads2bLOgAEDzN8SExMdAM7LL7/s/Pnnn06v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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
        "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
        "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
        "    for row in range(n_rows):\n",
        "        for col in range(n_cols):\n",
        "            index = n_cols * row + col  # 计算索引，从0开始\n",
        "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
        "            img_arr, label = train_ds[index]\n",
        "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
        "            plt.imshow(img_arr, cmap=\"binary\",\n",
        "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
        "            plt.axis('off')#去除坐标系\n",
        "            plt.title(class_names[label]) # 显示类别名称\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "\n",
        "#已知的图片类别\n",
        "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
        "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
        "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
        "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
        "#只是打印了前15个样本\n",
        "show_imgs(3, 5, train_ds, class_names)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-cXhg2tqE_9r"
      },
      "outputs": [],
      "source": [
        "# 从数据集到dataloader\n",
        "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
        "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "collapsed": false,
        "id": "_DEMlTA9E_9s"
      },
      "source": [
        "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
        "\n",
        "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
        "\n",
        "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
        "\n",
        "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
        "\n",
        "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
        "\n",
        "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
        "\n",
        "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AMRDAPSgE_9s"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MyL9T2PZE_9s"
      },
      "outputs": [],
      "source": [
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self):\n",
        "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
        "        self.flatten = nn.Flatten()  # 展平层\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
        "            nn.ReLU(), # 激活函数\n",
        "            nn.Linear(300, 100),#隐藏层神经元数100\n",
        "            nn.ReLU(), # 激活函数\n",
        "            nn.Linear(100, 10),#输出层神经元数10\n",
        "        )\n",
        "\n",
        "    def forward(self, x): # 前向计算\n",
        "        # x.shape [batch size, 1, 28, 28]\n",
        "        x = self.flatten(x)\n",
        "        # 展平后 x.shape [batch size, 784]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 10]\n",
        "        return logits #没有经过softmax,称为logits\n",
        "\n",
        "model = NeuralNetwork()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "tuHb_c8zE_9t",
        "outputId": "9d848008-27b1-4afe-f564-62f27f917ea1"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "NeuralNetwork(\n  (flatten): Flatten(start_dim=1, end_dim=-1)\n  (linear_relu_stack): Sequential(\n    (0): Linear(in_features=784, out_features=300, bias=True)\n    (1): ReLU()\n    (2): Linear(in_features=300, out_features=100, bias=True)\n    (3): ReLU()\n    (4): Linear(in_features=100, out_features=10, bias=True)\n  )\n)"
          },
          "execution_count": 18,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# 看看网络结构\n",
        "model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "GX7iw8pnE_9t",
        "outputId": "85d4c115-11bd-4e46-a6f4-20d84e8697e6"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "266610"
          },
          "execution_count": 19,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "784*300+300+300*100+100+100*10+10"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7wIxQJiIE_9t",
        "outputId": "44df4cc4-6ed3-4ac8-ee93-b0d58ba123ef"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "linear_relu_stack.0.weight torch.Size([300, 784])\n",
            "linear_relu_stack.0.bias torch.Size([300])\n",
            "linear_relu_stack.2.weight torch.Size([100, 300])\n",
            "linear_relu_stack.2.bias torch.Size([100])\n",
            "linear_relu_stack.4.weight torch.Size([10, 100])\n",
            "linear_relu_stack.4.bias torch.Size([10])\n"
          ]
        }
      ],
      "source": [
        "for name, param in model.named_parameters(): # 打印模型参数\n",
        "      print(name, param.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "oIE9C7Z7E_9t",
        "outputId": "364bf4c1-1836-45ef-f238-3dc4e0f1850c"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "[Parameter containing:\n tensor([[ 0.0197, -0.0019,  0.0188,  ..., -0.0344,  0.0148,  0.0281],\n         [ 0.0339,  0.0111, -0.0346,  ..., -0.0150, -0.0077,  0.0120],\n         [ 0.0283, -0.0012, -0.0145,  ...,  0.0240, -0.0286,  0.0164],\n         ...,\n         [-0.0103,  0.0226,  0.0246,  ...,  0.0072, -0.0274,  0.0174],\n         [-0.0230, -0.0281,  0.0328,  ..., -0.0168,  0.0289, -0.0048],\n         [ 0.0238,  0.0003,  0.0235,  ..., -0.0152,  0.0004,  0.0221]],\n        requires_grad=True),\n Parameter containing:\n tensor([-2.1050e-02, -1.9314e-02, -2.6576e-02,  1.3246e-02, -2.5810e-02,\n          8.0059e-03, -4.0981e-03, -2.6547e-02, -4.0199e-03,  2.0223e-02,\n         -6.8452e-03,  2.5522e-02, -1.1530e-02, -1.3210e-03, -2.3066e-02,\n          1.2100e-02,  1.6422e-02,  3.2263e-02, -2.6653e-02,  5.9833e-03,\n          1.7885e-02, -2.8033e-02,  1.7354e-03, -3.1785e-02, -2.8058e-02,\n          3.5126e-02,  1.8703e-02,  1.7342e-02,  3.3137e-02,  7.9030e-03,\n         -9.7580e-03, -1.3025e-02, -1.2485e-02, -1.4885e-02,  2.2343e-02,\n          2.3991e-02,  2.3657e-02,  1.1792e-04, -2.2924e-02,  2.9145e-02,\n         -3.0524e-02, -8.5632e-03,  9.5998e-03, -6.0649e-03,  2.1613e-02,\n         -9.9673e-03,  5.2075e-03,  3.2322e-02, -1.7615e-02, -3.4756e-03,\n         -3.0307e-02, -2.9611e-02, -2.1370e-02, -1.8454e-02, -1.9918e-02,\n          2.1922e-02, -4.9497e-03,  1.5263e-02, -1.5556e-03, -2.8485e-02,\n         -2.4385e-02,  2.1901e-02,  1.0883e-02,  3.4475e-02, -1.6224e-04,\n         -2.2289e-02,  1.9277e-02, -2.8782e-02, -2.2460e-02,  1.7166e-02,\n          2.0502e-02, -2.4870e-03, -1.1201e-02, -2.5182e-02, -1.9456e-02,\n         -3.5515e-02,  6.7390e-03, -3.4117e-02,  1.1170e-02, -2.2099e-02,\n         -1.7369e-02, -2.8536e-02,  2.7551e-02, -1.4172e-02,  3.8292e-03,\n         -1.1135e-02,  3.2708e-02,  2.5166e-02,  2.7477e-02,  7.5499e-03,\n         -2.7612e-02,  2.0464e-02,  1.9369e-02,  1.6136e-02, -2.7646e-02,\n         -3.0211e-02,  1.0383e-02, -2.0172e-03,  2.0835e-02,  3.4924e-02,\n          1.7167e-02, -8.0474e-03,  2.2624e-05, -1.4278e-02,  2.5172e-02,\n          2.8794e-02,  7.7580e-03,  3.3192e-02, -3.2882e-02,  3.5662e-02,\n          5.5504e-03,  5.8740e-03, -1.4467e-02, -2.7093e-02,  3.9164e-03,\n         -2.7451e-02,  2.5987e-03,  2.2366e-02,  1.5111e-02,  2.1005e-02,\n         -2.8695e-02,  2.3164e-02,  2.0061e-02,  2.8095e-02,  2.5704e-02,\n          3.7709e-03,  9.4083e-03, -1.5392e-02,  1.6506e-02, -1.5301e-02,\n          2.2287e-02,  2.9055e-02,  5.5264e-03,  2.3765e-02, -3.3732e-02,\n         -1.7466e-02,  2.6919e-02,  2.5695e-02,  6.0866e-03,  1.1001e-02,\n         -7.0402e-03,  1.2708e-02, -2.8719e-02,  2.8549e-02,  2.6545e-02,\n         -1.1645e-02,  1.1322e-02, -2.7334e-02, -1.2489e-02,  8.7290e-03,\n          3.2820e-02, -2.0122e-02, -2.9005e-02, -2.8816e-02, -7.9098e-03,\n          1.8073e-02,  2.5796e-02, -2.1713e-02,  2.5658e-02, -3.0044e-02,\n         -1.8457e-02, -7.6333e-03,  2.6855e-02,  3.0319e-02,  1.4851e-02,\n          1.1692e-02,  1.2689e-02, -1.3469e-02, -6.6083e-03,  3.1946e-02,\n         -1.0642e-03, -9.9706e-03, -5.1618e-03, -1.3057e-02,  2.9175e-02,\n         -1.0350e-02,  1.0834e-02, -1.8911e-02,  3.2929e-02, -9.7022e-03,\n          1.6919e-02, -2.5154e-02, -1.8531e-02,  2.4107e-02, -2.8309e-02,\n         -6.8789e-03,  3.3900e-02, -9.3259e-03,  2.0367e-02, -2.7695e-02,\n         -5.7768e-03, -2.1928e-02, -7.3732e-03, -2.6847e-02, -1.5531e-02,\n         -6.2058e-03,  3.5619e-02, -1.3138e-02,  5.7206e-04,  4.3437e-03,\n         -1.3741e-02, -2.1778e-02, -4.0394e-03,  1.8083e-02,  2.9634e-02,\n          3.0742e-02, -2.5131e-02,  1.6999e-02, -2.1274e-02,  1.5197e-02,\n         -1.5845e-02, -2.0283e-02,  2.7143e-03,  1.3767e-02,  5.0491e-03,\n          1.8341e-02, -3.1915e-02,  2.4155e-02, -1.1578e-02, -1.0281e-02,\n          2.4682e-03, -2.9838e-02, -1.3722e-02, -1.0683e-02,  5.2317e-03,\n         -3.1961e-02,  2.9169e-02, -6.7957e-03, -1.4377e-03,  1.5577e-02,\n          3.5137e-02,  1.6349e-02, -1.0426e-02, -2.5683e-03, -7.2982e-03,\n         -1.2943e-02,  1.9343e-02,  1.3223e-02,  2.3281e-02, -1.3918e-02,\n          1.5815e-02, -1.3981e-02, -2.4227e-02,  1.8644e-02, -3.4953e-02,\n         -4.4070e-03,  1.9709e-02, -1.4838e-02,  3.5673e-02, -1.4618e-03,\n          2.5542e-02, -2.8218e-02,  7.3523e-03, -6.1958e-03, -2.2752e-02,\n          7.7110e-03, -1.1244e-02, -2.3862e-02,  9.5969e-03,  7.7248e-03,\n         -1.3264e-02,  3.2863e-02,  1.8938e-02, -2.7677e-02, -1.2692e-02,\n         -5.9880e-03, -1.4882e-02, -8.0966e-03, -1.3946e-02, -6.3663e-04,\n          4.7108e-03, -2.4499e-02, -2.4798e-02, -3.0166e-03,  1.7670e-02,\n          3.1127e-02,  9.5361e-03,  2.4212e-02, -4.3462e-03, -3.4271e-02,\n          9.0047e-03, -5.7195e-03,  1.2753e-03,  3.1337e-02,  2.4517e-02,\n          3.1984e-02, -7.7789e-03,  2.4187e-02, -3.2379e-02, -2.2551e-02,\n         -3.3395e-02,  1.5578e-02,  3.1022e-02,  1.5726e-02,  1.3086e-02,\n          9.6259e-03,  2.7839e-02,  3.0091e-02, -1.1492e-02, -1.8206e-02],\n        requires_grad=True),\n Parameter containing:\n tensor([[ 0.0123,  0.0483, -0.0425,  ..., -0.0413, -0.0363, -0.0076],\n         [ 0.0309,  0.0310, -0.0536,  ...,  0.0107,  0.0064, -0.0459],\n         [ 0.0273, -0.0055, -0.0498,  ...,  0.0492, -0.0010,  0.0091],\n         ...,\n         [-0.0322,  0.0263,  0.0366,  ..., -0.0029, -0.0335,  0.0372],\n         [-0.0315, -0.0063,  0.0423,  ..., -0.0079,  0.0346,  0.0184],\n         [-0.0375, -0.0014,  0.0513,  ...,  0.0280,  0.0177, -0.0183]],\n        requires_grad=True),\n Parameter containing:\n tensor([-0.0228,  0.0139, -0.0460, -0.0280,  0.0028,  0.0102, -0.0549, -0.0252,\n         -0.0295,  0.0338,  0.0355,  0.0031,  0.0558,  0.0507,  0.0204,  0.0214,\n          0.0431, -0.0493, -0.0472, -0.0548,  0.0477,  0.0118,  0.0462, -0.0099,\n         -0.0072, -0.0181, -0.0292,  0.0548,  0.0316,  0.0024, -0.0263,  0.0290,\n          0.0120,  0.0370, -0.0280,  0.0464, -0.0512,  0.0496,  0.0037,  0.0199,\n          0.0564,  0.0248, -0.0272,  0.0431,  0.0248,  0.0474,  0.0388,  0.0370,\n          0.0278, -0.0481, -0.0019,  0.0508,  0.0442,  0.0174,  0.0328,  0.0016,\n         -0.0048,  0.0005,  0.0405, -0.0038,  0.0318, -0.0551,  0.0551, -0.0420,\n          0.0121, -0.0535,  0.0337,  0.0078, -0.0537,  0.0384, -0.0036, -0.0300,\n          0.0066,  0.0055, -0.0394,  0.0484,  0.0287, -0.0076,  0.0486,  0.0333,\n         -0.0233, -0.0398,  0.0404, -0.0088,  0.0027, -0.0530, -0.0423,  0.0103,\n         -0.0526, -0.0449, -0.0510, -0.0002,  0.0132, -0.0537,  0.0210, -0.0352,\n          0.0298, -0.0316, -0.0270,  0.0347], requires_grad=True),\n Parameter containing:\n tensor([[-6.0130e-02, -8.3495e-02,  9.6607e-02, -5.7429e-02, -9.6071e-02,\n          -8.3338e-02, -3.3011e-02, -6.9930e-02, -6.3223e-02, -3.1966e-03,\n           5.8682e-02,  7.2221e-02, -2.1062e-02, -5.6546e-02,  5.1099e-02,\n           9.7967e-02, -3.7028e-02,  5.3559e-02, -8.6131e-02, -6.9208e-02,\n           8.0710e-02, -7.3043e-02,  4.5039e-02, -9.3380e-02, -7.8587e-02,\n           9.3720e-02,  7.7505e-02, -5.6351e-02,  6.7467e-03, -9.3763e-02,\n          -5.2262e-02,  5.9072e-02,  5.1391e-02,  4.2821e-03,  3.2556e-02,\n           6.3899e-02, -4.4313e-02, -8.9473e-02, -9.8254e-02, -5.5724e-02,\n           1.0261e-03,  1.0582e-02,  7.9726e-02,  4.5462e-02, -3.1519e-02,\n          -7.5007e-02, -6.8078e-02,  9.5482e-02,  2.9369e-02, -2.9901e-02,\n          -6.3054e-02, -4.1868e-02, -7.3120e-02,  3.0573e-02,  1.2656e-02,\n          -2.4444e-02,  7.0800e-02, -7.5909e-02,  4.3673e-02, -5.8786e-02,\n          -8.5634e-02,  5.6461e-02,  7.0702e-02, -9.9231e-02, -4.3549e-02,\n          -7.9827e-02, -1.4030e-02,  8.8482e-02,  4.5954e-02,  7.8292e-02,\n          -5.6477e-02, -7.2849e-03,  7.7692e-02, -8.4456e-02,  8.8740e-02,\n           5.4060e-02,  6.6025e-02,  3.2243e-02,  7.5337e-03, -3.2036e-02,\n          -7.6570e-02,  7.3407e-02,  3.6837e-02, -2.2644e-02, -3.9086e-02,\n           2.3395e-02,  7.4497e-03,  3.3712e-02,  2.1986e-02, -5.3247e-02,\n          -3.3054e-02, -7.2131e-02,  2.8450e-02,  3.8844e-02,  6.2580e-02,\n          -9.1337e-02, -3.1493e-02, -1.7929e-02, -3.7643e-02,  2.5197e-02],\n         [-1.3236e-04,  9.4036e-02,  5.6964e-02, -6.6412e-02,  3.4064e-03,\n          -7.6178e-02,  7.9663e-02,  2.4730e-03,  6.4032e-02, -5.4588e-02,\n          -3.7366e-02, -9.5438e-02, -7.9044e-02, -1.5881e-02, -6.6345e-02,\n          -2.0953e-02,  9.4760e-02,  1.9920e-02,  7.7501e-03,  9.6019e-02,\n           5.7768e-02,  5.0741e-02,  7.0149e-02,  5.7490e-02,  5.3715e-02,\n          -1.3677e-02,  7.6855e-02,  1.7013e-02,  8.4212e-03, -1.3155e-02,\n          -4.2644e-02,  6.5930e-02, -6.9459e-03, -5.6164e-02,  1.5528e-02,\n          -1.8926e-02, -3.7959e-02,  6.5165e-03,  2.2758e-02, -3.0728e-02,\n           7.0005e-02,  2.5183e-02, -9.5417e-02,  5.6544e-02,  5.0016e-02,\n          -6.2522e-02,  3.0933e-02,  1.8161e-02,  3.2408e-02, -8.7170e-02,\n           6.9874e-02, -3.7772e-02,  8.8603e-02,  7.6133e-03, -4.0512e-02,\n           2.4179e-02, -1.6096e-03,  1.1196e-03, -6.0443e-02,  8.1556e-02,\n          -1.3739e-02,  8.7892e-02,  8.2008e-03, -9.2654e-02,  9.6815e-03,\n          -3.9118e-02, -7.5247e-02, -6.3157e-02, -1.2610e-02,  8.4260e-03,\n          -1.8649e-02, -7.3806e-02, -6.2894e-02,  5.2154e-02,  7.2742e-02,\n           4.2855e-02, -6.6772e-02, -4.3242e-02, -5.6507e-03,  9.3130e-02,\n          -2.9259e-02, -7.0200e-02, -9.8912e-02,  6.7631e-02,  9.2828e-02,\n          -7.6511e-02, -7.6219e-02,  1.2133e-02, -6.9237e-04, -1.2154e-03,\n          -4.3823e-02,  4.9812e-02,  7.7890e-02,  9.2359e-02,  7.9810e-02,\n          -3.1719e-02, -6.2083e-02,  4.3272e-02, -6.4213e-02, -5.6480e-02],\n         [ 4.0483e-02, -6.8416e-03, -5.2425e-02,  9.3152e-02,  6.4434e-02,\n          -9.8190e-02,  4.7990e-03,  6.0009e-02,  8.6882e-02,  5.1153e-02,\n          -2.8519e-02,  7.1608e-02, -8.9633e-03,  4.8728e-02, -7.1871e-02,\n           2.0788e-02,  4.5276e-02,  8.1203e-02, -7.1214e-02, -2.9254e-02,\n           2.2983e-02,  1.8083e-02,  5.0721e-02, -9.9948e-02, -1.7609e-02,\n          -6.8137e-02, -4.7844e-02, -5.9178e-02,  2.0026e-02, -8.9974e-02,\n           1.1555e-02, -8.6759e-02,  1.5619e-02, -1.1790e-02, -1.4634e-02,\n          -7.0560e-02,  2.6573e-02,  3.9585e-02, -5.3253e-03, -4.6472e-02,\n          -1.1857e-02,  8.5200e-02, -4.1485e-02,  2.4965e-02,  9.2092e-02,\n          -1.2298e-03, -5.2900e-02, -1.1399e-02,  1.2087e-02,  7.9048e-02,\n          -5.5766e-02, -7.6177e-02, -3.1099e-03, -4.7613e-02, -8.0160e-02,\n          -8.0346e-02, -2.1055e-03,  8.8014e-02, -7.4857e-03,  6.8898e-02,\n           3.8736e-02,  8.7398e-02, -2.4868e-02,  6.9595e-03, -5.1288e-02,\n           2.0060e-02,  5.0386e-02, -5.0755e-02,  8.2797e-02, -9.5554e-03,\n          -7.5282e-02,  5.1161e-02, -8.9509e-02,  1.8322e-02,  6.9332e-02,\n          -6.7907e-03, -5.3345e-02, -2.3632e-02,  7.5079e-02,  7.4746e-03,\n          -9.5109e-02,  7.9615e-02, -9.4885e-02,  6.3109e-02, -7.0714e-02,\n           8.0563e-02,  3.4645e-02,  3.9211e-03,  6.9876e-02, -8.1899e-02,\n           5.4073e-02,  1.4628e-02,  4.4878e-02, -5.3106e-02,  2.1994e-02,\n           6.1222e-03,  5.5426e-02, -8.0531e-02, -6.7794e-02, -7.7613e-02],\n         [ 2.4500e-02,  7.2333e-02, -3.1123e-02, -8.7001e-02, -2.7453e-02,\n           6.7959e-02, -8.3819e-03,  7.7426e-02, -1.7909e-02, -8.8891e-02,\n           5.8366e-02,  4.8936e-02,  9.2684e-02,  5.2533e-02, -7.9488e-02,\n           1.8379e-02, -3.0360e-02, -3.0753e-02, -3.4733e-02, -9.0119e-02,\n           4.7143e-02, -5.0747e-02,  2.1179e-04,  3.8950e-02, -8.9712e-02,\n           6.6451e-02, -9.6144e-02, -6.1788e-02,  7.0850e-02,  3.9342e-02,\n          -1.2581e-02,  3.6897e-02, -4.4431e-02,  6.8393e-02,  4.8829e-02,\n           4.9818e-02, -2.3020e-02,  5.8259e-02,  9.6217e-02, -3.5013e-02,\n          -4.6166e-02, -5.4435e-02,  3.2281e-02,  6.2610e-02,  1.2985e-02,\n           1.8624e-02,  4.6095e-02, -7.0899e-02,  5.4375e-02, -2.6193e-02,\n           2.8783e-02, -6.1728e-02, -2.5476e-02,  4.4656e-02,  3.3932e-02,\n           3.6489e-02,  2.5059e-02, -1.9401e-02, -4.9903e-02,  8.9120e-02,\n           2.4902e-02,  8.1709e-03,  2.9631e-02,  4.7083e-02, -4.4443e-02,\n           9.9905e-02,  6.3115e-02,  6.9755e-02,  9.5924e-02,  4.9799e-02,\n           2.9365e-02,  9.7140e-02, -5.2250e-02,  3.1216e-02,  4.8113e-02,\n           7.7540e-02,  4.0199e-02, -9.0440e-02,  3.2212e-03,  6.6246e-02,\n           6.7680e-02,  7.3278e-02, -4.0867e-02,  8.5295e-02,  8.5161e-02,\n          -1.3434e-02,  8.2480e-02, -7.2191e-02,  8.8933e-02, -3.4732e-02,\n           7.7661e-03,  7.5514e-02, -2.1365e-03,  7.5696e-02,  5.3812e-03,\n           7.5000e-02,  7.5694e-02,  7.3452e-02,  9.5269e-02,  1.6848e-02],\n         [ 6.1502e-02,  5.3355e-02, -4.7905e-03, -5.2838e-02, -9.5927e-02,\n           6.7455e-02, -8.4958e-02,  6.6829e-02, -2.9967e-03,  2.1280e-02,\n          -3.2498e-02, -6.5983e-02, -2.0610e-02, -4.0055e-02,  6.5298e-02,\n          -2.1123e-02, -9.9509e-02, -7.9316e-02, -6.5123e-02,  7.1169e-02,\n           9.1964e-02, -4.9223e-02,  3.6991e-02, -7.3808e-03,  7.1614e-02,\n          -5.6272e-02, -3.8589e-02, -8.5887e-02,  3.1559e-02, -8.6663e-02,\n          -9.6395e-02,  7.2603e-02, -1.1392e-02, -5.2626e-02,  1.0194e-02,\n           6.4996e-02, -7.4184e-02,  2.9827e-02, -1.2699e-02,  4.3498e-02,\n          -5.7315e-02, -6.9941e-03,  2.5196e-03,  1.7897e-03,  3.8093e-02,\n           6.9372e-02,  2.4994e-02,  7.4098e-02,  7.4752e-02, -9.6323e-02,\n          -7.6453e-02, -4.3497e-02, -2.9401e-02, -1.0443e-02, -7.4434e-02,\n          -7.7771e-02,  3.3348e-02,  6.7751e-02, -7.9955e-02, -2.4751e-02,\n          -4.6703e-02, -9.0535e-02, -9.3259e-02, -3.5107e-02, -6.4710e-02,\n          -5.1747e-02,  3.1003e-02,  4.3647e-02, -5.4505e-02,  4.2885e-02,\n           5.6999e-02, -9.5596e-02,  1.5339e-02,  8.4570e-02,  5.4454e-02,\n           4.7324e-02, -8.3082e-03, -2.2075e-03, -7.8938e-02,  3.8479e-02,\n           6.0532e-02,  6.4987e-02,  3.3774e-02, -2.1088e-02, -3.4947e-02,\n           9.7092e-02, -2.7822e-02,  1.0286e-02,  2.9398e-02,  7.3497e-02,\n          -7.2091e-02, -6.0638e-02,  4.9215e-02,  6.8468e-02, -1.6549e-02,\n           3.6786e-02,  1.0914e-02,  8.5312e-03, -4.5943e-02,  3.2379e-02],\n         [ 4.1773e-02,  1.5597e-02, -8.3080e-02, -8.7704e-02, -9.5537e-02,\n          -8.3099e-02, -8.9799e-02,  1.3072e-02, -3.5797e-02,  1.7768e-02,\n           1.7838e-03,  1.0944e-02, -7.6687e-02,  3.7210e-02, -5.7545e-02,\n          -4.6480e-02,  8.5321e-02,  3.2783e-02,  6.9899e-02,  6.4874e-02,\n           5.8726e-02, -2.5157e-02, -8.2586e-02, -6.9001e-02, -1.5943e-02,\n          -6.5620e-02,  9.6708e-02, -8.7270e-02,  2.9402e-02, -5.6570e-02,\n          -2.3157e-02,  7.4283e-02,  9.6706e-02,  3.3162e-02,  4.1436e-02,\n           5.6776e-02, -7.8789e-02,  2.6912e-02, -9.2613e-02, -8.3989e-02,\n          -6.4931e-02, -6.0251e-02,  1.8715e-02, -9.6741e-02,  4.7408e-02,\n           3.1221e-02, -7.0431e-02, -5.9665e-03, -5.4955e-02,  3.3854e-02,\n           3.5086e-02, -8.9525e-02,  9.7129e-02,  2.4386e-02,  6.7243e-02,\n          -1.4420e-02,  9.3975e-02,  7.6519e-02, -1.0521e-02, -4.5299e-02,\n           2.8422e-02,  7.0808e-02,  7.6344e-02, -2.4676e-02, -8.2343e-02,\n           4.8513e-03,  3.8305e-02,  9.0185e-02,  9.9975e-02, -9.8007e-02,\n          -4.6836e-02, -5.7161e-02, -1.9042e-02,  5.3226e-02, -8.1587e-03,\n           1.7198e-03,  8.3452e-02, -3.3746e-02,  6.3629e-02,  6.9027e-02,\n          -9.7742e-02,  9.7319e-02, -7.5568e-02, -7.1789e-02, -7.1928e-02,\n          -8.3824e-02,  9.9516e-02, -4.7114e-03, -8.8986e-02, -7.7001e-02,\n          -7.9901e-02, -9.8906e-02,  4.4254e-02,  8.6815e-02,  4.5723e-02,\n          -6.3458e-02,  6.5326e-02, -7.1798e-04, -8.3412e-02, -8.9374e-03],\n         [-1.1792e-02, -2.4718e-02, -2.6703e-02, -2.9230e-02, -9.6841e-02,\n          -9.1168e-02,  7.0478e-02, -2.1019e-02, -7.1793e-02,  3.3938e-02,\n           5.2035e-02, -6.7805e-02,  1.0297e-02,  2.7471e-02,  8.7953e-03,\n           2.4990e-02,  4.3063e-02, -3.4315e-02,  3.9873e-02, -7.9880e-02,\n          -5.7821e-02,  8.4742e-02, -2.1708e-02,  4.8998e-02,  1.1451e-03,\n           1.8876e-02,  6.5861e-02,  5.8204e-02, -6.4397e-02, -3.1337e-02,\n          -8.6048e-02, -3.7334e-04, -2.3949e-02, -9.9014e-03,  4.3647e-02,\n          -1.9256e-02, -4.6234e-02,  1.5653e-02, -3.8841e-02, -5.7615e-02,\n          -9.1229e-02, -2.5033e-02, -3.8859e-02,  7.3722e-02,  7.4554e-03,\n           5.2559e-02,  7.2811e-02, -8.8392e-03,  7.0505e-02, -6.9892e-02,\n           2.4908e-02,  9.9568e-03, -2.2079e-02, -4.4446e-02, -7.6628e-02,\n          -4.6345e-02,  2.8048e-02, -5.8549e-02, -5.2784e-02, -9.5117e-02,\n           4.6063e-02,  4.0065e-02,  1.5487e-02, -6.7593e-02,  5.8174e-02,\n           7.4716e-03,  9.6367e-02, -1.5685e-02,  3.5757e-02,  2.9894e-02,\n          -7.5247e-02,  9.4140e-02,  8.9437e-02,  3.7649e-02,  8.3018e-02,\n          -5.7398e-02, -1.4741e-02,  8.7193e-02,  9.9387e-02, -7.4430e-02,\n          -9.9500e-02, -5.9486e-03, -5.8153e-02, -8.4599e-03, -8.7248e-02,\n          -1.0705e-02, -9.7384e-02,  7.5056e-02,  3.2841e-03,  1.7219e-02,\n           4.8087e-02,  8.6383e-02,  2.6693e-02, -4.4950e-02, -5.4816e-03,\n           5.3111e-02,  3.4996e-02,  3.1422e-03, -5.0440e-02,  7.6522e-02],\n         [ 7.1793e-02, -6.0904e-02,  2.3984e-02,  8.8754e-02, -4.3350e-02,\n           2.8011e-02, -3.1942e-02,  5.1153e-02, -5.7419e-02, -9.3506e-02,\n          -7.7082e-03,  6.0579e-02, -7.0845e-02,  5.1071e-02, -7.4927e-02,\n          -8.3890e-02, -8.2645e-02,  1.2694e-02,  1.9767e-02,  2.3414e-02,\n           8.7182e-04,  3.0216e-02,  5.9771e-02,  6.9352e-02,  1.5419e-02,\n           7.5056e-02, -7.0732e-02, -2.5136e-02, -4.5398e-02, -6.2426e-02,\n          -5.6146e-02, -9.7006e-02,  5.9835e-02, -8.9028e-02,  8.3071e-02,\n          -4.5400e-02,  1.4934e-02, -7.3336e-05,  2.7643e-02,  7.0380e-02,\n          -6.7910e-03,  2.8293e-03, -8.8105e-03,  6.1241e-02, -4.4993e-02,\n          -2.6538e-02,  8.1207e-02, -6.4572e-02, -5.6349e-02,  1.1088e-02,\n          -7.9169e-02, -3.3891e-03,  3.4153e-02,  5.7154e-02, -9.9531e-03,\n           6.6727e-02, -7.6919e-02, -6.4555e-03, -9.5412e-02, -1.3207e-02,\n          -7.4825e-02,  8.7543e-02, -5.5766e-02,  5.3109e-02, -9.3936e-02,\n          -2.3520e-02,  9.3521e-02,  7.3517e-02,  6.5344e-02,  2.0140e-02,\n           8.2339e-02,  3.9801e-02, -6.5118e-02,  2.1250e-02, -8.9497e-02,\n           6.1368e-02, -4.6784e-02,  7.9716e-02,  8.4359e-02,  4.1103e-02,\n           2.4400e-02, -5.4142e-02,  7.0597e-02, -5.5107e-02, -8.8124e-02,\n           2.7846e-02, -3.4760e-02, -7.8880e-02,  6.0654e-02, -7.2346e-02,\n          -3.4012e-02,  2.3183e-02,  6.2211e-02, -7.4443e-02,  6.6295e-02,\n           1.1815e-02, -8.3835e-02,  9.5845e-02,  6.6863e-02, -5.8462e-02],\n         [-5.2836e-02, -3.4448e-02, -9.4741e-03, -9.7441e-03, -4.7255e-02,\n          -7.2035e-03,  6.0127e-02,  4.7272e-02, -6.4846e-02, -7.6542e-02,\n           3.4532e-02, -2.7678e-02,  2.7798e-02,  6.7987e-02, -8.3811e-02,\n           5.9718e-02, -4.5933e-02,  4.7198e-02,  8.4391e-02, -8.4525e-03,\n           2.1610e-02,  9.9988e-02, -3.2389e-02,  2.2483e-02,  1.9926e-02,\n          -4.5760e-02,  2.5794e-02, -3.6250e-02, -8.3315e-02,  7.4150e-02,\n          -6.8732e-02, -4.7845e-02, -7.0721e-02, -9.2449e-02,  7.8981e-02,\n          -8.1422e-02, -7.1579e-02, -5.5846e-02, -7.4096e-02, -4.9513e-02,\n           9.5629e-02,  6.2916e-02,  3.1054e-02, -3.9284e-02,  2.3542e-03,\n           8.7997e-02,  1.3928e-02, -9.3415e-02,  1.4924e-02, -5.5195e-03,\n           2.2549e-02, -9.2701e-03,  3.2844e-02,  4.6076e-04, -3.9216e-02,\n           1.8694e-02,  2.7758e-02, -4.8808e-02,  8.4745e-03,  6.8715e-02,\n           7.1682e-02, -4.0621e-02, -8.8940e-02,  6.6823e-02,  1.8080e-03,\n          -7.3351e-03,  3.3169e-02, -1.8774e-03, -9.5529e-02,  1.6290e-02,\n           6.6862e-05,  7.6996e-02, -7.7901e-02,  8.9373e-02, -5.4796e-02,\n           4.0845e-02,  6.9346e-02,  2.6311e-02,  5.6524e-02,  7.7192e-03,\n           4.0614e-02, -2.8587e-02, -4.2787e-02,  9.9284e-02, -6.0119e-02,\n           6.7653e-02, -7.5410e-02, -8.6914e-02,  6.0864e-02, -3.9379e-03,\n           3.7693e-02, -8.8116e-02,  2.5395e-02, -2.1937e-02, -6.6113e-02,\n          -7.4082e-02, -1.3656e-02,  7.8158e-02, -2.6194e-02, -2.5878e-03],\n         [ 3.6682e-03, -9.5649e-02, -7.7369e-02, -4.3635e-03,  8.2738e-02,\n           2.1932e-02,  7.4693e-02,  9.3547e-02,  7.5407e-02, -2.0256e-02,\n          -2.3761e-02,  2.2601e-02,  9.2214e-02,  3.1568e-02,  3.6623e-02,\n          -2.4496e-02, -4.7960e-02, -8.3394e-02, -2.7056e-02, -6.0002e-02,\n          -8.8228e-03,  2.3158e-02, -3.5178e-02, -9.6841e-02, -6.9582e-02,\n          -8.5318e-02,  6.6652e-03,  9.7461e-02, -8.1189e-02, -8.3079e-02,\n           3.0666e-02,  4.9231e-02,  9.5852e-02,  2.6855e-02,  4.5381e-02,\n           7.9014e-02,  6.0334e-02, -2.2344e-02,  1.2585e-02, -9.6757e-02,\n          -2.7457e-03, -5.7651e-02, -5.9702e-02,  4.6691e-02, -7.2139e-02,\n          -7.6851e-02, -6.4360e-02,  8.3329e-02,  7.3978e-02,  8.7770e-02,\n          -9.4119e-02, -1.6744e-02, -1.2021e-03,  3.7532e-02,  2.6994e-02,\n          -9.9777e-02, -2.7699e-02,  1.9135e-02,  2.8201e-03, -4.9553e-02,\n          -4.1715e-02,  5.5384e-02,  1.3868e-03, -1.6193e-02, -9.3173e-02,\n           9.2439e-02, -8.3537e-02, -1.8666e-02,  8.9735e-02, -6.9066e-02,\n           5.4657e-03,  2.7258e-02,  4.4724e-02,  3.1664e-02, -6.6928e-04,\n          -4.0023e-02,  7.9911e-02, -6.9789e-02, -2.5266e-02, -6.0303e-02,\n          -1.1250e-02,  2.9992e-02,  8.0512e-02,  9.7115e-02, -7.6228e-02,\n          -9.4497e-02, -4.5781e-02, -4.8058e-02, -3.3176e-02, -8.4835e-02,\n          -1.2173e-02, -6.9307e-02, -9.9202e-02, -5.4777e-02, -4.3978e-02,\n           5.1879e-03,  4.2043e-02,  1.9867e-02, -2.4383e-02,  8.8266e-02]],\n        requires_grad=True),\n Parameter containing:\n tensor([ 0.0274,  0.0221, -0.0726,  0.0271, -0.0003,  0.0845,  0.0734,  0.0123,\n         -0.0865,  0.0055], requires_grad=True)]"
          },
          "execution_count": 21,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# 看看模型参数\n",
        "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YZQAXCFQE_9u"
      },
      "outputs": [],
      "source": [
        "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MpuVAOTWE_9u"
      },
      "source": [
        "## 训练\n",
        "\n",
        "pytorch的训练需要自行实现，包括\n",
        "1. 定义损失函数\n",
        "2. 定义优化器\n",
        "3. 定义训练步\n",
        "4. 训练"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hIBnQJgIE_9u"
      },
      "outputs": [],
      "source": [
        "# 1. 定义损失函数 采用交叉熵损失\n",
        "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package,随机梯度下降\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4eWw3crDE_9u"
      },
      "outputs": [],
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = [] # 记录损失\n",
        "    pred_list = [] # 记录预测\n",
        "    label_list = [] # 记录标签\n",
        "    for datas, labels in dataloader:#10000/32=312\n",
        "        datas = datas.to(device) # 转到GPU\n",
        "        labels = labels.to(device) # 转到GPU\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失\n",
        "        loss_list.append(loss.item()) # 记录损失\n",
        "\n",
        "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
        "        # print(preds)\n",
        "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
        "        # print(preds.cpu().numpy().tolist())\n",
        "        label_list.extend(labels.cpu().numpy().tolist())\n",
        "\n",
        "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
        "    return np.mean(loss_list), acc\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DVdzzA6vE_9v",
        "outputId": "0386de20-8fed-4f03-fb35-33744b45e394"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "37500"
          },
          "execution_count": 25,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "1875*20"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "referenced_widgets": [
            "8caa82c7623647999980834cf354e12a"
          ]
        },
        "id": "d-cQ66AsE_9v",
        "outputId": "5d98509b-4a42-443d-f429-6560cb0f0f6f"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "8caa82c7623647999980834cf354e12a",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": "  0%|          | 0/37500 [00:00<?, ?it/s]"
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# 训练\n",
        "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
        "        for epoch_id in range(epoch): # 训练epoch次\n",
        "            # training\n",
        "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
        "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
        "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas)\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
        "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
        "\n",
        "                preds = logits.argmax(axis=-1) # 训练集预测\n",
        "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
        "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
        "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval() # 进入评估模式\n",
        "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
        "                    })\n",
        "                    model.train() # 进入训练模式\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1 # 全局步数加1\n",
        "                pbar.update(1) # 更新进度条\n",
        "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
        "\n",
        "    return record_dict\n",
        "\n",
        "\n",
        "epoch = 20 #改为40\n",
        "model = model.to(device)\n",
        "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Mltffuj5E_9v",
        "outputId": "a1271f6f-7492-4b70-81dd-6440092b3348"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "[{'loss': 0.1997792273759842, 'acc': 0.9375, 'step': 37495},\n {'loss': 0.27049633860588074, 'acc': 0.875, 'step': 37496},\n {'loss': 0.1393028050661087, 'acc': 0.9375, 'step': 37497},\n {'loss': 0.2725451588630676, 'acc': 0.84375, 'step': 37498},\n {'loss': 0.4061542749404907, 'acc': 0.8125, 'step': 37499}]"
          },
          "execution_count": 33,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "record[\"train\"][-5:]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ALcQRT_oE_9w",
        "outputId": "89260768-fc46-4025-e2c1-5dcf6adf874f"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "[{'loss': 0.36084355672184654, 'acc': 0.8712, 'step': 33000},\n {'loss': 0.35720211475754315, 'acc': 0.8724, 'step': 34000},\n {'loss': 0.36683890228263866, 'acc': 0.8709, 'step': 35000},\n {'loss': 0.36297369616243025, 'acc': 0.8713, 'step': 36000},\n {'loss': 0.35757329757697287, 'acc': 0.874, 'step': 37000}]"
          },
          "execution_count": 34,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "record[\"val\"][-5:]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "NDxdejmUE_9w",
        "outputId": "60d94f07-6adb-457c-ca33-03c3bb698a94"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "step\n",
            "0        0.06250\n",
            "1000     0.62500\n",
            "2000     0.71875\n",
            "3000     0.71875\n",
            "4000     0.75000\n",
            "5000     0.87500\n",
            "6000     0.78125\n",
            "7000     0.87500\n",
            "8000     0.90625\n",
            "9000     0.75000\n",
            "10000    0.90625\n",
            "11000    0.84375\n",
            "12000    0.84375\n",
            "13000    0.84375\n",
            "14000    0.93750\n",
            "15000    0.75000\n",
            "16000    0.81250\n",
            "17000    0.87500\n",
            "18000    0.93750\n",
            "19000    0.81250\n",
            "20000    0.93750\n",
            "21000    0.93750\n",
            "22000    0.75000\n",
            "23000    0.75000\n",
            "24000    0.90625\n",
            "25000    0.96875\n",
            "26000    0.87500\n",
            "27000    0.87500\n",
            "28000    0.93750\n",
            "29000    0.90625\n",
            "30000    0.90625\n",
            "31000    0.87500\n",
            "32000    0.78125\n",
            "33000    0.90625\n",
            "34000    0.81250\n",
            "35000    0.90625\n",
            "36000    0.90625\n",
            "37000    1.00000\n",
            "Name: acc, dtype: float64\n",
            "step\n",
            "0        0.1023\n",
            "1000     0.6786\n",
            "2000     0.7747\n",
            "3000     0.7975\n",
            "4000     0.8043\n",
            "5000     0.8209\n",
            "6000     0.8171\n",
            "7000     0.8307\n",
            "8000     0.8246\n",
            "9000     0.8264\n",
            "10000    0.8391\n",
            "11000    0.8379\n",
            "12000    0.8371\n",
            "13000    0.8385\n",
            "14000    0.8501\n",
            "15000    0.8458\n",
            "16000    0.8459\n",
            "17000    0.8560\n",
            "18000    0.8537\n",
            "19000    0.8543\n",
            "20000    0.8603\n",
            "21000    0.8589\n",
            "22000    0.8596\n",
            "23000    0.8617\n",
            "24000    0.8583\n",
            "25000    0.8635\n",
            "26000    0.8641\n",
            "27000    0.8645\n",
            "28000    0.8657\n",
            "29000    0.8687\n",
            "30000    0.8692\n",
            "31000    0.8628\n",
            "32000    0.8706\n",
            "33000    0.8712\n",
            "34000    0.8724\n",
            "35000    0.8709\n",
            "36000    0.8713\n",
            "37000    0.8740\n",
            "Name: acc, dtype: float64\n"
          ]
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": "<Figure size 1000x500 with 2 Axes>"
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=1000):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "    last_step = train_df.index[-1] # 最后一步的步数\n",
        "    # print(train_df.columns)\n",
        "    print(train_df['acc'])\n",
        "    print(val_df['acc'])\n",
        "    # plot\n",
        "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
        "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        # print(train_df[item].values)\n",
        "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        axs[idx].grid() # 显示网格\n",
        "        axs[idx].legend() # 显示图例\n",
        "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
        "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
        "        axs[idx].set_xlabel(\"step\")\n",
        "\n",
        "    plt.show()\n",
        "\n",
        "plot_learning_curves(record)  #横坐标是 steps"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6yENbqhtE_9w"
      },
      "source": [
        "## 评估"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "FdAgk38JE_9x",
        "outputId": "d973224d-b9dd-4afa-c5a9-cf32d38ca19a"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "loss:     0.3578\n",
            "accuracy: 0.8700\n"
          ]
        }
      ],
      "source": [
        "# dataload for evaluating\n",
        "\n",
        "model.eval() # 进入评估模式\n",
        "loss, acc = evaluating(model, val_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.9.7"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}